home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-17 | 8.8 KB | 269 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: FWScpCal.cpp
- // Release Version: $ ODF 2 $
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #ifndef FWSCPCAL_H
- #include "FWScpCal.h"
- #endif
-
- //========================================================================================
- // Template Instantiations
- //========================================================================================
-
- #ifdef FW_USE_TEMPLATE_PRAGMAS
-
- #pragma template_access public
-
- #pragma template FW_TMap<ODDescType, FWDescCoerceFunc>
- #pragma template FW_TPair<ODDescType, FWDescCoerceFunc>
-
- #pragma template FW_TMap<ODDescType, FWDescComparisonFunc>
- #pragma template FW_TPair<ODDescType, FWDescComparisonFunc>
-
- #pragma template FW_TPrivDestroyer<FW_CDescCoercionCallbacks>
- #pragma template FW_TPrivDestroyer<FW_CDescComparisonCallbacks>
-
- #elif defined (__SC__)
-
- template class FW_TPrivDestroyer<FW_CDescCoercionCallbacks>;
- template class FW_TPrivDestroyer<FW_CDescComparisonCallbacks>;
-
- #endif
-
- //========================================================================================
- // Static Allocations
- //========================================================================================
-
- FW_CDescCoercionCallbacks* FW_CDescCoercionCallbacks::fgInstance;
- FW_TPrivDestroyer<FW_CDescCoercionCallbacks> FW_CDescCoercionCallbacks::fgDestroyer;
-
- FW_CDescComparisonCallbacks* FW_CDescComparisonCallbacks::fgInstance;
- FW_TPrivDestroyer<FW_CDescComparisonCallbacks> FW_CDescComparisonCallbacks::fgDestroyer;
-
- //========================================================================================
- // Key Comparison Procs
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_PrivCompareCoercionPairs
- //----------------------------------------------------------------------------------------
-
- static int FW_PrivCompareCoercionPairs(void* p1, void* p2)
- {
- const ODDescType key1 = ((FW_CPrivDescTypeToCoercionPair*)p1)->fKey;
- const ODDescType key2 = ((FW_CPrivDescTypeToCoercionPair*)p2)->fKey;
-
- if (key1 == key2)
- return 0;
- else if (key1 > key2)
- return 1;
- else
- return -1;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_PrivCompareComparisonPairs
- //----------------------------------------------------------------------------------------
-
- static int FW_PrivCompareComparisonPairs(void* p1, void* p2)
- {
- const ODDescType key1 = ((FW_CPrivDescTypeToComparisonPair*)p1)->fKey;
- const ODDescType key2 = ((FW_CPrivDescTypeToComparisonPair*)p2)->fKey;
-
- if (key1 == key2)
- return 0;
- else if (key1 > key2)
- return 1;
- else
- return -1;
- }
-
- //========================================================================================
- // class FW_CDescCoercionCallbacks
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_CDescCoercionCallbacks::FW_CDescCoercionCallbacks
- //----------------------------------------------------------------------------------------
-
- FW_CDescCoercionCallbacks::FW_CDescCoercionCallbacks() :
- fMap(FW_PrivCompareCoercionPairs)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescCoercionCallbacks::~FW_CDescCoercionCallbacks
- //----------------------------------------------------------------------------------------
-
- FW_CDescCoercionCallbacks::~FW_CDescCoercionCallbacks()
- {
- fgInstance = NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescCoercionCallbacks::RegisterHandler
- //----------------------------------------------------------------------------------------
-
- void FW_CDescCoercionCallbacks::RegisterHandler(ODDescType toType,
- FWDescCoerceFunc func)
- {
- FW_CDescCoercionCallbacks* callbacks = Instance(TRUE);
- FW_ASSERT(!callbacks->fMap.Find(toType));
- callbacks->fMap.Add(toType, func);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescCoercionCallbacks::RemoveHandler
- //----------------------------------------------------------------------------------------
-
- void FW_CDescCoercionCallbacks::RemoveHandler(ODDescType toType)
- {
- FW_CDescCoercionCallbacks* callbacks = Instance(FALSE);
- if (!callbacks)
- FW_Failure(FW_xBadRemove);
-
- callbacks->fMap.Remove(toType);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescCoercionCallbacks::InvokeHandler
- //----------------------------------------------------------------------------------------
-
- FW_Handled FW_CDescCoercionCallbacks::InvokeHandler(const FW_CDesc& sourceDesc,
- ODDescType toType,
- FW_CDesc& coercedDesc)
- {
- FW_Handled handled = FW_kNotHandled;
- FW_CDescCoercionCallbacks* callbacks = Instance(FALSE);
-
- if (callbacks)
- {
- FW_TRY
- {
- FW_CPrivDescTypeToCoercionPair* pair = callbacks->fMap.Find(toType);
- if (pair)
- {
- handled = pair->fValue(sourceDesc, toType, coercedDesc);
- }
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING()
- {
- }
- FW_CATCH_END
- }
- return handled;
-
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescCoercionCallbacks::Instance
- //----------------------------------------------------------------------------------------
-
- FW_CDescCoercionCallbacks* FW_CDescCoercionCallbacks::Instance(FW_Boolean create)
- {
- if (!fgInstance && create)
- {
- fgInstance = new FW_CDescCoercionCallbacks;
- fgDestroyer.SetDoomed(fgInstance);
- }
- return fgInstance;
- }
-
- //========================================================================================
- // class FW_CDescComparisonCallbacks
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_CDescComparisonCallbacks::FW_CDescComparisonCallbacks
- //----------------------------------------------------------------------------------------
-
- FW_CDescComparisonCallbacks::FW_CDescComparisonCallbacks() :
- fMap(FW_PrivCompareComparisonPairs)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescComparisonCallbacks::~FW_CDescComparisonCallbacks
- //----------------------------------------------------------------------------------------
-
- FW_CDescComparisonCallbacks::~FW_CDescComparisonCallbacks()
- {
- fgInstance = NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescComparisonCallbacks::RegisterHandler
- //----------------------------------------------------------------------------------------
-
- void FW_CDescComparisonCallbacks::RegisterHandler(ODDescType compareType,
- FWDescComparisonFunc func)
- {
- FW_CDescComparisonCallbacks* callbacks = Instance(TRUE);
- FW_ASSERT(!callbacks->fMap.Find(compareType));
- callbacks->fMap.Add(compareType, func);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescComparisonCallbacks::RemoveHandler
- //----------------------------------------------------------------------------------------
-
- void FW_CDescComparisonCallbacks::RemoveHandler(ODDescType comparisonOperator)
- {
- FW_CDescComparisonCallbacks* callbacks = Instance(FALSE);
- if (!callbacks)
- FW_Failure(FW_xBadRemove);
-
- callbacks->fMap.Remove(comparisonOperator);
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescComparisonCallbacks::InvokeHandler
- //----------------------------------------------------------------------------------------
-
- FW_Handled FW_CDescComparisonCallbacks::InvokeHandler(ODDescType comparisonOperator,
- const FW_CDesc& lhDesc,
- const FW_CDesc& rhDesc,
- FW_Boolean& result)
- {
- FW_Handled handled = FW_kNotHandled;
- FW_CDescComparisonCallbacks* callbacks = Instance(FALSE);
-
- if (callbacks)
- {
- FW_TRY
- {
- FW_CPrivDescTypeToComparisonPair* pair = callbacks->fMap.Find(comparisonOperator);
- if (pair)
- {
- handled = pair->fValue(comparisonOperator, lhDesc, rhDesc, result);
- }
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING()
- {
- }
- FW_CATCH_END
- }
- return handled;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CDescCoercionCallbacks::Instance
- //----------------------------------------------------------------------------------------
-
- FW_CDescComparisonCallbacks* FW_CDescComparisonCallbacks::Instance(FW_Boolean create)
- {
- if (!fgInstance && create)
- {
- fgInstance = new FW_CDescComparisonCallbacks;
- fgDestroyer.SetDoomed(fgInstance);
- }
- return fgInstance;
- }
-